package com.xzc.tankgame4;

import java.util.Vector;

/**
 * @author 徐州城
 * @version 1.0
 * 请在XzcTankGame02.java基础上画出三辆坦克，注意颜色
 * <p>
 * 敌人的坦克
 * 分析：
 * 1. 因为敌人的坦克，是在MyPanel上，所以我们的代码在MyPanel
 * 2. 因为敌人的坦克，后面有自己特殊的属性和方法，可以单开一个EnemyTank
 * 3. 敌人的坦克数量多，可以放入到集合 Vector，因为考虑多线程问题
 */
public class EnemyTank extends Tank implements Runnable {
    //在敌人坦克类，使用Vector 保存多个Shot
    Vector<Shot> shots = new Vector<>();
    boolean isLive = true;

    public EnemyTank(int x, int y) {
        super(x, y);
    }

    @Override
    public void run() {

        while (isLive) {

            //这里我们判断如果 shots size() = 0，创建一颗子弹，放入到
            //shots集合里 并且 坦克当前是存活的，并启动
            if (isLive && shots.size() < 10) {
                Shot s = null;

                //判断坦克的方向，创建对应的子弹
                switch (super.getDirect()) {
                    case 0:
                        s = new Shot(getX() + 20, getY(), 0);
                        break;
                    case 1:
                        s = new Shot(getX() + 60, getY() + 20, 1);
                        break;
                    case 2:
                        s = new Shot(getX() + 20, getY() + 60, 2);
                        break;
                    case 3:
                        s = new Shot(getX(), getY() + 20, 3);
                        break;
                }
                //每隔10秒
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                shots.add(s);
                //启动线程
                new Thread(s).start();
            }

            //产生一个 30 ~ 40 的随机数 方便对坦克移动
            int random = (int) (Math.random() * 11) + 30;

            //根据坦克的方向来进行移动
            switch (getDirect()) {
                case 0://向上
                    for (int i = 0; i < random; i++) {
                        if (getY() > 0) {//表示坦克向上移动的区域
                            super.moveUp();
                        } else {
                            //表示 如果当if 条件为false时 就代表 当前坦克已经到达了边界 为了防止卡在边界不动，直接break 进入下一次移动判断
                            break;
                        }

                        //休眠50豪秒
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case 1://向右
                    for (int i = 0; i < random; i++) {
                        if (getX() + 60 < 1000) {
                            super.moveRight();
                        } else {
                            break;
                        }

                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case 2://向下
                    for (int i = 0; i < random; i++) {
                        if (getY() + 60 < 750) {
                            super.moveDown();
                        } else {
                            break;
                        }

                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case 3://向左
                    for (int i = 0; i < random; i++) {
                        if (getX() > 0) {
                            super.moveLeft();
                        } else {
                            break;
                        }

                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
            }

            //然后随机的改变坦克方向 0 ~ 3
            setDirect((int) (Math.random() * 4));

            //听老韩说，写并发程序，一定要考虑清楚，该线程什么时候结束
//            if (!isLive) {
//                break;//退出线程
//            }
        }

    }
}
